
\chapter{语句}

语句是由关键字和表达式构成的，代表了要执行的指定动作。
语句只能存在于函数中，并且除特定语句外，必须按顺序执行。

\vspace{2ex}

\noindent \textbf{语法}

\begin{verbatim}
stmt = simple_stmt | compound_stmt | label_stmt
stmt_list = empty | stmt_list stmt
stmt_list_opt = stmt | LBRACE stmt_list RBRACE
\end{verbatim}

语句可以分为简单语句、复合语句和标号语句。
简单语句是不包含其它语句的语句，与此相对，复合语句则是包含了其它语句的语句。
标号语句并不执行``动作"，而是定义了一个程序中的可以跳转的位置。

语句通常以分号结尾，若只有分号，则构成了特殊的语句``空语句"。

0个或多个语句可以构成\verb!语句列表!。

单个语句或者以大括号括起来的语句列表，可以构成\verb!代码块!。

\section{标号语句}

标号语句声明了一个程序中的位置，标号语句并不执行特定工作。

\subsection*{原型}

\begin{verbatim}
label_stmt = IDENTIFIER ':'
\end{verbatim}

标号语句中的标识符即该标号的名称，需要是一个合法的标识符，因此不能为数值。
在同一个函数中，不能有相同名称的标号。在分隔符冒号之后，即该标号指代的语句。

\section{简单语句}

简单语句包含函数变量声明语句、赋值语句、表达式语句、goto语句、
返回语句、raise语句、break语句、exit语句、retry语句、trynext语句、
connect语句及空语句。

\vspace{2ex}

\noindent \textbf{语法}

\begin{verbatim}
simple_stmt = decl_stmt | assign_stmt | expr_stmt
              | return_stmt | break_stmt | void_stmt
\end{verbatim}

\subsection{函数变量声明语句}

函数变量声明语句用于声明函数中的常变量和普通变量（函数中不能包含持久变量）。

\vspace{2ex}

\noindent \textbf{语法}

\begin{verbatim}
decl_stmt = const_decl | var_decl
\end{verbatim}

常变量声明和普通变量声明大体相同，不同的是：
\begin{itemize}
	\item 关键字\hspace{1.0cm}声明常变量时使用const关键字说明声明的是常变量
	\item 初始化\hspace{1.0cm}声明常变量时必须对变量进行初始化，普通变量则不用
\end{itemize}

初始化表达式必须为常量表达式。

\subsection{赋值语句}

赋值语句用于改变变量（普通变量、持久变量、函数参数）的现有值。

\vspace{2ex}

\noindent \textbf{语法}

\begin{verbatim}
assign_stmt = variable '=' expr ';'
\end{verbatim}

在赋值语句中，variable对应的变量的值会被替换为表达式expr的值， variable变量的类型和表达式expr的类型
必须相同。

允许对数组和结构变量整体赋值。

\subsection{表达式语句}

表达式语句是直接由表达式构成的语句，包含函数调用语句和自增/自减语句。

\vspace{2ex}

\noindent \textbf{语法}

\begin{verbatim}
expr_stmt = func_call ';' | unary_expr ';'
\end{verbatim}

表达式语句是由函数调用表达式或一元操作符表达式直接构成的，但表达式语句的最后包含一个分号。
需要注意的是，表达式unary\_expr只能是自增运算符表达式或自减运算符表达式，
不能是逻辑非运算符表达式或正负号运算符表达式。

\subsection{return语句}

return语句用于结束当前函数的执行，然后从函数调用语句的下一语句继续执行。

\vspace{2ex}

\noindent \textbf{语法}

\begin{verbatim}
return_stmt = RETURN ';' | RETURN expr ';'
\end{verbatim}

如果函数声明中返回值类型为void，则return语句中不能指定返回值；否则，需要指定一个返回值。
一个函数中可以包含多个return语句，在返回值类型为void的函数中可以不包含return语句。
return语句可以出现在函数中的任意位置。

如果return语句是在任务的入口函数中，则执行该return语句会引起任务的结束；
如果return语句是在陷阱（trap）函数中，则执行该return语句会从中断点继续执行。

\subsection{break语句}

break语句用于跳出for循环语句、while循环语句或switch语句的执行。
如果这些语句是嵌套在其它的循环语句或switch语句中，
则break语句会跳出最内层的循环语句或switch语句。

\vspace{2ex}

\noindent \textbf{语法}

\begin{verbatim}
break_stmt = BREAK ';'
\end{verbatim}

\subsection{空语句}

空语句是只包含分号的语句。

\vspace{2ex}

\noindent \textbf{语法}

\begin{verbatim}
void_stmt = ';'
\end{verbatim}

空语句不包含任何指定的动作，可以暂时用于一些语句的语句列表中，例如，用于循环中作为循环体使用。
通常空语句的使用是不适宜的，而且空语句可以使源代码中多余的分号不会成为语法错误，因此需要注意其使用。

\section{复合语句}

复合语句包括if语句、for循环语句、while循环语句、switch语句。

\noindent \textbf{语法}

\begin{verbatim}
compound_stmt = if_stmt | for_stmt | while_stmt | switch_stmt
\end{verbatim}

\subsection{if语句}

if语句会根据表达式的布尔值而执行程序的不同部分。

\vspace{2ex}

\noindent \textbf{语法}

\begin{verbatim}
if_stmt = IF '(' expr ')' stmt_list_opt
          | IF '(' expr ')' stmt_list_opt ELSE stmt_list_opt
\end{verbatim}

if语句以if关键字开头，后跟小括号括起来的条件表达式，后跟if语句的代码块。
if语句还可以后跟else语句，else语句以else关键字开头，后跟else语句的代码块。

if语句的一般形式为：

\begin{verbatim}
    if (expr) {
        then-statement
    } else {
        else-statement
    }
\end{verbatim}

在运行时，如果表达式expr的值为真，则会执行then-statement的语句列表，而else-statement的语句列表不会被执行；
如果表达式expr的值为假，则会执行else-statement的语句列表，而then-statement的语句列表不会被执行。

else语句是可选的，因此有一种简单的if语句形式：

\begin{verbatim}
    if (expr) {
        then-statement
    }
\end{verbatim}

在运行时，只有表达式expr的值为真时才会执行then-statment的语句列表，为假时则不执行。

else语句后的语句还可以是一个if语句，形如：

\begin{verbatim}
    if (expr) {
        then-statement
    } else if (expr2) {
        then-statement2
    } else {
        else-statement
    }
\end{verbatim}

当运行时，如果表达式expr的值为真，则执行语句列表then-statement。如果表达式expr的值为假，而expr2的值为真，
则执行语句列表then-statement2。如果expr和expr2同时为假，则执行语句列表else-statement。

如果需要判断的情况较多，可以使用多个else if语句增加判断，例如：

\begin{verbatim}
    if (expr) {
        then-statement
    } else if (expr2) {
        then-statement2
    } else if (expr3) {
        then-statement3

    ...

    } else {
        else-statement
    }
\end{verbatim}

\subsection{for循环语句}

有两种形式的循环语句：for循环语句和while循环语句。

\noindent \textbf{语法}

\begin{verbatim}
for_stmt = FOR '(' for_loop_var_decl_opt ';' expr ';' for_loop_expr_opt ')' stmt_list_opt
for_loop_var_decl_opt = empty | data_type IDENTIFIER array_suffix_opt '=' expr
for_loop_expr_opt = empty | expr
\end{verbatim}

for语句以关键字for开头，后跟小括号括起来的初始化表达式、终止表达式、循环表达式，后跟for语句的代码块。
在小括号中，初始化表达式、终止表达式、循环表达式使用分号进行分割。终止表达式必须为布尔类型。

在执行时，会先执行for语句的初始化表达式。每次循环时，会先求解终止表达式的值，若其值为假，则退出循环；
若其值为真，则执行for语句代码块中的语句，然后执行循环表达式语句，之后重复循环。

\subsection{while循环语句}

在while循环中，只要检测的表达式的布尔值为真，就会重复执行其循环体。

\noindent \textbf{语法}

\begin{verbatim}
while_stmt = WHILE '(' expr ')' stmt_list_opt
\end{verbatim}

while语句以关键字while开头，后跟小括号括起来的条件表达式，后跟while语句的代码块。

条件表达式expr需要具有布尔类型，且每次循环前都会对其进行求值。若其值为真，
则执行一次代码块stmt\_lis\_opt中的语句；若其值为假，则退出循环。

\subsection{switch语句}

switch语句中存在一个可选的列表，程序会根据给定表达式和列表项的是否匹配而选择执行不同的程序分支。

\vspace{2ex}

\noindent \textbf{语法}

\begin{verbatim}
switch_stmt = SWITCH '(' expr ')' LBRACE case_list_opt default_opt RBRACE

case_list_opt = empty | case_list
case_list = case_part | case_list case_part
case_part = CASE expr_list ':' stmt_list_opt

default_opt = empty | default_part
default_part = DEFAULT ':' stmt_list_opt
\end{verbatim}

表达式expr给出了需要进行检测的表达式，每个关键字case后跟一个值的集合，集合中可以包含一个或多个不同的值。
当表达式expr的值存在于该集合中，则执行该case语句代码块stmt\_list\_opt中的语句。

switch语句还包含一个可选的default语句，当表达式expr的值不在任意一个case语句的值的集合中时，
则执行default语句代码块stmt\_list\_opt中的语句。
如果有多个case语句满足条件，则只执行第一个满足条件的case语句代码块stmt\_list\_opt中的语句。

每个case语句的任一表达式的类型都必须和表达式expr的类型相同。

示例：

\begin{verbatim}
    num n;

    switch (n) {
    case 1, 2, 3, 4: {
        print("small");
    }
    case 5:
        print("medium");
    case 6, 7, 8, 9:
        print("big");
    default:
        print("illegal");
    }
\end{verbatim}
